﻿using Max.PH5_2008A.ShoppingCode.Dto;
using Max.PH5_2008A.ShoppingCode.IService;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Max.PH5_2008A.ShoppingCode.API.Controllers
{
    /// <summary>
    /// Redis购物车操作
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class ShoppingCarController : ControllerBase
    {

        /*
         * 如何使用Redis
         * 1、安装包：CsRedisCore
         * 2、实始化redis对象，连接redis服务器，得知道redis服务器的地址  127.0.0.1:6379
         * 3、用Get和Set
         *          
         * **/

        CSRedis.CSRedisClient _client;
        INewProductSKUService _service;
        INewProductSKUImageService _newProductSKUImageService;
        public ShoppingCarController(INewProductSKUService service, INewProductSKUImageService newProductSKUImageService)
        {
            _client = new CSRedis.CSRedisClient("127.0.0.1:6379");

            //RedisHelper.Initialization(_client);

            _service = service;
            _newProductSKUImageService = newProductSKUImageService;
        }


        /// <summary>
        /// 将商品添加到购物车
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult Insert(ShoppingCarDto dto)
        {
            //用户添加的时候，一次只能添加一样产品
            //缓存购物车里面可以放多个产品

            string key = dto.MemberId;

            //先要拿到缓存里面的数据
            List<ShoppingCarDto> cars = _client.Get<List<ShoppingCarDto>>(key);

            #region 判断库存

            ////去数据库找到这个商品
            //var data = _service.Query().Where(x => dto.GoodsId.Equals(x.Id.ToString())).FirstOrDefault();

            //if (data != null)
            //{
            //    if (data.ValidStock < dto.GoodsNumber)
            //        return BadRequest("库存不足");
            //}
            #endregion

            //在缓存数据中，先找一下，有没有待添加的商品
            if (cars == null)
            {
                cars = new List<ShoppingCarDto>();
                cars.Add(dto);
            }
            else
            {
                var model = cars.Where(x => x.GoodsId == dto.GoodsId).FirstOrDefault();
                if (model != null)
                {
                    //找到了同类商品，数量累加
                    model.GoodsNumber += dto.GoodsNumber;
                }
                else
                {
                    cars.Add(dto);
                }
            }

            //每次都缓存进行了修改都需要更新
            _client.Set(key, cars);

            return Ok("添加成功");
        }

        /// <summary>
        /// 将商品从购物车删除
        /// </summary>
        /// <returns></returns>
        [HttpDelete]
        public IActionResult Delete(List<ShoppingCarDto> dtos)
        {
            //参数是集合，所以取其中另一一条
            string key = dtos[0].MemberId;

            //从缓存里把数据拿出来
            var data = _client.Get<List<ShoppingCarDto>>(key);

            if (data == null)
                return BadRequest("没有到找相关数据");

            //循环去找，在所有数据中找到后就删除
            dtos.ForEach(x =>
            {
                var m = data.Where(p => x.GoodsId.Equals(p.GoodsId)).FirstOrDefault();
                if (m != null)
                    data.Remove(m);
            });

            _client.Set(key, data);
            return Ok("删除成功");
        }

        /// <summary>
        /// 从redis里查找数据
        /// </summary>
        /// <param name="memberId"></param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult Query(string memberId)
        {
            string key = memberId;

            //从redis里获取的数据
            var data = _client.Get<List<ShoppingCarDto>>(key);

            //sku里的数据
            var list = _service.Query();
            var images = _newProductSKUImageService.Query();

           var q =  from a in data
            join b in list on a.GoodsId equals b.Id.ToString()
            //join c in images on b.Id equals c.SKUId
            select new
            {
                Name = b.Code,
                Image =  images.Where(x=>x.SKUId == b.Id).FirstOrDefault()?.ImagePath,  //c.ImagePath,
                Stock = b.ValidStock,
                a.GoodsPrice,
                a.GoodsNumber,
                a.GoodsId,
                a.MemberId
            };

            return Ok(q);
        }


        /// <summary>
        /// 修改购物车（只修改购物车中商品的数量）
        /// </summary>
        /// <returns></returns>
        [HttpPut]
        public IActionResult Update(ShoppingCarDto dto)
        {
            string key = dto.MemberId;

            /*
             * 修改购物车中具体某个商品的数量 
             * **/
            var data = _client.Get<List<ShoppingCarDto>>(key);
            if (data == null)
            {
                return BadRequest("购物车空的，快去购物吧");
            }

            #region 判断库存(是具体的某个商品。用数据库里的数据【库存】来和界面上即传进来的数量【dto】进行比较)
            //从数据库数据中查找这个商品

            //var d = _service.Query().Where(x => dto.GoodsId.Equals(x.Id.ToString())).FirstOrDefault();

            //if (d == null)
            //{
            //    return BadRequest("数据有误");
            //}
            //else
            //{
            //    if (d.ValidStock < dto.GoodsNumber)
            //    {
            //        return BadRequest("库存不足");
            //    }
            //}


            #endregion

            //找到这个具体商品(只有一个，所有用FirstDefault)
            var model = data.Where(x => dto.GoodsId.Equals(x.GoodsId)).FirstOrDefault();
            if (model != null)
            {
                model.GoodsNumber = dto.GoodsNumber;
            }

            //修改完成，需要更新到缓存redis(是更新整个这个用户的数据data，而不是具体的商品model)
            _client.Set(key, data);

            return Ok("修改成功");
        }



        #region 2023/3/13 周考3-修改购物车商品数量

        /// <summary>
        /// 修改购物车中的商品数量，一次只能修改一个，修改的时候，
        /// 需要三个条件：用户（即会员）Id，修改的商品ID，修改的商品数量
        /// </summary>
        /// <param name="memeberId"></param>
        /// <param name="goodsId"></param>
        /// <param name="goodsNumber"></param>
        /// <returns></returns>
        [HttpGet("demo/update1")]
        public IActionResult UpdateCarNumber(string memeberId,string goodsId,string goodsNumber)
        {
            return Ok();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPut("demo/update2")]
        public IActionResult UpdateCarNumber(UpdateCarNumberModel model)
        {

            //先拿出redis的数据
            string key = model.memeberId;

            //get默认的时候，获取的值是字符串。
            //但是我们存在reids里的数据是list集合。
            //所有需要将我们获取的data数据，转为list集合
            /*
             * 怎么转：
             * 1、直接
             * var data =_client.Get<<List<ShoppingCarDto>>(key)
             * 
             * 2、序列化和反序列化
             * var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<ShoppingCarDto>>(data);
             * **/
            var data = _client.Get<List<Dto.ShoppingCarDto>>(key);

            if(data != null)
            {
                //从redis中获取数据后，在这些数据中，去找到要修改的商品数据
                var m = data.Where(x => model.goodsId.Equals(x.GoodsId)).FirstOrDefault();
                if (m != null)
                {
                    //修改商品的数量
                    m.GoodsNumber = Convert.ToInt32(model.goodsNumber);
                }
            }

            //更新完成后，需要记得更新到缓存
            _client.Set(key, data);


            return Ok();
        }

        #endregion

    }

    public class UpdateCarNumberModel
    {
        public string memeberId{get;set;}
        public string goodsId{get;set;}
        public string goodsNumber{get;set;}
    }
}
